from django.shortcuts import render
from pyecharts.charts import Bar, Pie, Geo, WordCloud
from pyecharts import options as opts
from pyecharts.globals import ThemeType

from analysis.models import *
from reservation.models import Reservation
from cars.models import *
from collections import defaultdict
import random
from django.views import View
import pymysql
import requests
from bs4 import BeautifulSoup

db_config = {
    'host': 'localhost',
    'port': 3306,
    'user': 'root',
    'password': '123456',
    'database': 'mysite_db',
    'charset': 'utf8mb4',
}

# 创建 MySQL 连接对象
conn = pymysql.connect(**db_config)
cursor = conn.cursor()


def car(request):
    carnames_list = car_sales.objects.all()
    carname_list = []
    for carname in carnames_list:
        carname_list.append(carname.name)
    numbers_list = []
    for number in carnames_list:
        numbers_list.append(number.numbers)

    # 创建一个字典，将汽车名称和计数配对（但在这里我们直接使用列表）
    # 创建柱状图对象，并使用汽车名称和它们的数量来添加数据
    bar = (
        Bar(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND, width="750px", height="400px"))
        .add_xaxis(carname_list)  # 使用汽车名称作为X轴数据
        .add_yaxis("数量", numbers_list)  # 使用数量作为Y轴数据
        .set_global_opts(title_opts=opts.TitleOpts(title="汽车热销榜", subtitle="Top15 销售数据"),
                         xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),  # 设置X轴标签倾斜45度
                         datazoom_opts=[opts.DataZoomOpts()],  # 显示滚动条
                         )
    )

    chart_html = bar.render_embed()  # 注意：在某些Pyecharts版本中，可能需要使用 render_notebook() 或直接 render() 到文件

    # 将图表HTML传递给模板
    # 获取所有汽车类型
    cartype_queryset = Cartype.objects.all()
    cartype_dict = {cartype.id: cartype for cartype in cartype_queryset}  # 创建一个字典以便快速查找Cartype对象
    print(f'汽车类型：{cartype_dict}')
    # 使用defaultdict来计数每个typeid的出现次数
    type_counts = defaultdict(int)
    sum = 0
    for car in Cars.objects.all():
        type_counts[car.type_id] += 1  # 中有一个名为type_id的外键指向Cartype
        sum = sum + 1
    # 准备饼图数据：类型名称和对应的数量
    pie_data = []
    for typeid, count in type_counts.items():
        cartype = cartype_dict.get(typeid)  # 从字典中获取Cartype对象
        counts = round((count / sum) * 100, 2)
        if cartype:
            pie_data.append((cartype.type_name, counts))
            # 创建饼图
    # print(pie_data)
    pie = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND, width="450px", height="300px"))
        .add("汽车类型", pie_data)  # 第一个参数设置为系列名
        .set_global_opts(
            title_opts=opts.TitleOpts(title="热销车型占比"),
            legend_opts=opts.LegendOpts(is_show=True, pos_left="right")  # 显示图例并设置位置
        )
        .set_series_opts(
            label_opts=opts.LabelOpts(formatter="{b}: {c}%", position="outside"),  # 外部显示标签
            radius=["40%", "70%"]  # 设置内外半径以调整饼图大小
        )
    )

    # 渲染饼图
    pie_html = pie.render_embed()

    # 中国各省新能源汽车占比图
    data = [
        ("海南", 12153),
        ("陕西", 57372),
        ("上海", 44067),
        ("广西", 36150),
        ("浙江", 135847),
        ("重庆", 30438),
        ("天津", 29496),
        ("河南", 87622),
        ("江苏", 141454),
        ("广东", 190029),
    ]

    # 创建 Geo 地图
    geo = (
        Geo(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND, width="750px", height="400px"))
        .add_schema(maptype="china")  # 设置地图类型为中国
        .add("新能源汽车销售数量", data, type_="scatter")  # 更改系列名称为“新能源汽车销售数量”
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))  # 不显示标签
        .set_global_opts(
            title_opts=opts.TitleOpts(title="中国各省新能源汽车销售数量分布图"),
            visualmap_opts=opts.VisualMapOpts(max_=max(value for _, value in data), is_piecewise=False),
            # 使用数据集中的最大值作为颜色映射的上限
        )
    )
    geo_html = geo.render_embed()

    # 热销品牌词云图
    # 获取所有汽车的品牌
    models = Carmodels.objects.all()
    models_dict = {cartype.id: cartype for cartype in models}
    # 使用defaultdict来计数每个modelid的出现次数
    model_counts = defaultdict(int)
    for car in Cars.objects.all():
        model_counts[car.model_id] += 1

    word_list = []
    # 准备饼图数据：类型名称和对应的数量
    for modelid, count in model_counts.items():
        model = models_dict.get(modelid)  # 从字典中获取Cartype对象
        if model:
            word_list.append((model.mname, count))

    print(word_list)
    #
    # 创建词云图
    word = (
        WordCloud(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND, width="450px", height="500px"))
        .add("", word_list, word_size_range=[20, 100])  # 注意这里我们省略了系列名称
        .set_global_opts(title_opts=opts.TitleOpts(title="热销品牌词云图",
                                                   title_textstyle_opts=opts.TextStyleOpts(font_family="cursive",
                                                                                           font_size=20)))
        # 注意：title_textstyle_opts 实际上在 Pyecharts 的某些版本中可能不存在，
        # 你需要查看你正在使用的 Pyecharts 版本的文档。
        # 如果不支持，你可能需要寻找其他方法来设置标题样式，或者接受默认样式。
    )

    # 渲染词云图为 HTML 代码
    word_html = word.render_embed()
    # ---------人气榜---------------------
    carrenqi_list = car_popularity.objects.all().order_by('id')

    user = request.session.get('user')
    if user:
        reservation_list = Reservation.objects.filter(user_id=user.id)
        number = len(reservation_list)
        return render(request, 'templates/analysis/car.html', {'chart_html': chart_html,
                                                               'number': number,
                                                               'pie_html': pie_html,
                                                               'geo_html': geo_html,
                                                               'carrenqi_list': carrenqi_list,
                                                               'word_html': word_html, })

    else:
        return render(request, 'templates/analysis/car.html', {'chart_html': chart_html,
                                                               'pie_html': pie_html,
                                                               'geo_html': geo_html,
                                                               'carrenqi_list': carrenqi_list,
                                                               'word_html': word_html, })
